﻿using Tetris.Game.ControlsBase.Common;

namespace Tetris.Game
{
    public static class SystemEx
    {
        //
        // 摘要:
        //     释放异步资源
        //
        // 参数:
        //   obj:
        //
        // 类型参数:
        //   T:
        //public static async ValueTask DisposeAsyncEx<T>(this T obj) where T : class, IAsyncDisposable
        //{
        //    if (!obj.IsNull())
        //    {
        //        await obj.DisposeAsync();
        //    }
        //}

        //
        // 摘要:
        //     释放对象
        //
        // 参数:
        //   obj:
        //
        // 类型参数:
        //   T:
        public static void DisposeEx<T>(this T obj) where T : class, IDisposable
        {
            if (!obj.IsNull())
            {
                obj.Dispose();
            }
        }

        //
        // 摘要:
        //     释放对象
        //
        // 参数:
        //   exFunc:
        //     扩展功能
        //
        //   obj:
        //
        // 类型参数:
        //   T:
        public static void DisposeEx<T>(this T obj, Action<T> exFunc) where T : class, IDisposable
        {
            if (!obj.IsNull())
            {
                exFunc(obj);
                obj.Dispose();
            }
        }

        //
        // 摘要:
        //     判断对象是否为null(扩展函数)
        //
        // 参数:
        //   obj:
        //     对象
        //
        // 类型参数:
        //   T:
        public static bool IsNull<T>(this T obj) where T : class
        {
            if (obj == null)
            {
                return true;
            }

            return false;
        }

        //
        // 摘要:
        //     字符串是否为null
        //
        // 参数:
        //   v:
        //     字符串
        //
        //   isGuid:
        //     是否判断guid
        public static bool IsNullOrEmpty(this string v, bool isGuid = false)
        {
            if (string.IsNullOrEmpty(v))
            {
                return true;
            }

            if (isGuid && v.Trim() == Guid.Empty.ToString("N"))
            {
                return true;
            }

            return false;
        }

        //
        // 摘要:
        //     裁剪字符串
        //
        // 参数:
        //   v:
        //
        //   length:
        //     长度
        //
        //   suffix:
        //     后缀
        public static string CutString(this string v, int length, string suffix = "")
        {
            if (v.Length >= length)
            {
                return v.Substring(0, length) + suffix;
            }

            return v;
        }
        public static void ExecBeginInvoke(this Control con, Action action)
        {
            if (action == null) return;
            if (con.InvokeRequired)
            {
                con.BeginInvoke(new Action(action));
            }
            else
            {
                action();
            }
        }
        public static void ExecInvoke(this Control con, Action action)
        {
            if (action == null) return;
            if (con.InvokeRequired)
            {
                con.Invoke(new Action(action));
            }
            else
            {
                action();
            }
        }
        public static List<InfoIdValue> GetListAllEnumType(this Type type)
        {
            if (!type.IsEnum)
                return null;

            var enumValues = Enum.GetValues(type);
            var list = new List<InfoIdValue>();
            foreach (Enum value in enumValues)
            {
                list.Add(new InfoIdValue
                {
                    Id = value.GetHashCode().ToString(),
                    Value = value.ToString(),
                });
            }
            return list;
        }

    }
}
